#!/usr/bin/env python

################################################################################
# Python Standard Library
################################################################################

import struct

################################################################################
# Includes
################################################################################

from protocols.d2 import D2Packet, D2Socket
from protocols.realm import RealmPacket, RealmSocket
from protocols.server import ServerPacket, ServerSocket

################################################################################
# Packets
################################################################################

GameListResponse 						= "\x05"
MOTDResponse							= "\x12"
JoinGameResponse						= "\x12"

################################################################################
# Packet Handlers
################################################################################

class D2RSPacket(D2Packet, RealmPacket, ServerPacket):
	"""
	Diablo II Realm Server Packet
	"""
	
	def __init__(self):
		D2Packet.__init__(self)
		RealmPacket.__init__(self)
		ServerPacket.__init__(self)
	
	def unpack(self):
		print "Unpacking BNRS packet..."
		
		self.dispatchEvent("unpack", (self,))
		
		print "BNRS packet unpacked."
	
	def pack(self):
		print "Packing BNRS packet..."
		
		self.dispatchEvent("pack", (self,))
		
		print "BNRS packet packed."
		
		return self.message

################################################################################
# Socket Handlers
################################################################################

class D2RSSocket(D2Socket, RealmSocket, ServerSocket):
	"""
	Battle.net Realm Server Socket
	"""
	
	def __init__(self, sock = None):
		D2Socket.__init__(self, sock)
		RealmSocket.__init__(self, sock)
		ServerSocket.__init__(self, sock)

	def unpackPackets(self):
		i, l = 0, len(self.data)
		
		while i < l:
			packet = D2RSPacket()
			packet.socket = self
			packet.messageLength = struct.unpack("<H", self.data[i:i+2])[0]
			packet.messageID = self.data[i+2]
			packet.messageData = self.data[i+3:i+packet.messageLength-3]
			packet.message = self.data[i:i+packet.messageLength]
			
			packet.unpack()
			
			self.packets.append(packet)
			
			i += packet.messageLength
		
		self.data = ''